package com.hugeyurt.direct;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class ProducerDirect {
    private final static String QUEUE_NAME1 = "my_queue1";
    private final static String QUEUE_NAME2 = "my_queue2";
    private final static String QUEUE_NAME3 = "my_queue3";
    private final static String QUEUE_NAME4 = "my_queue4";

    private final static String key1="key1";
    private final static String key3="key3";
    private final static String key4="key4";


    private final static String exchange_name = "my_exchange_direct";

    public static void main(String[] args)
    {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost"); // RabbitMQ服务器地址
        factory.setUsername("guest"); // 默认用户名
        factory.setPassword("guest"); // 默认密码
        factory.setPort(5672);//设置端口号

        try
        {
            //创建连接对象
            Connection connection = factory.newConnection();
            //创建信道
            Channel channel = connection.createChannel();
            //创建交换机
            /*
              1 交换机名称
              2、交换机类型： direct,topic,fanout及 headers
              3、指定交换机是否持久化，true 持久化，否则是false
              4  没有队列绑定时是否需要删除，false 不删除
              5  Map<String,Object> 交换机的其他结构化参数，这里设置为null
             */
             channel.exchangeDeclare(exchange_name, BuiltinExchangeType.DIRECT,true,false,null );


            // 声明队列（持久化、非排他、非自动删除）
            /*
              1  队列名字
              2、队列是否需要持久化 （这里的持久化是持久化队列的名称信息元素，不是队列中消息的持久化
              3、队列是不是私有化， （true）私有的只有创建它的进程才能用，
              4、队列没有订阅者是否删除
              5、队列一些结果化信息，暂时不用

             */
            channel.queueDeclare(QUEUE_NAME1, true, false, false, null);
            channel.queueDeclare(QUEUE_NAME2, true, false, false, null);
            channel.queueDeclare(QUEUE_NAME3, true, false, false, null);
            channel.queueDeclare(QUEUE_NAME4, true, false, false, null);
             /*
               交换机绑定
               1、队列名称
               2、交换机名称
               3、路由健，直连情况下，为队列名称
              */
            channel.queueBind(QUEUE_NAME1,exchange_name,key1);
            channel.queueBind(QUEUE_NAME2,exchange_name,key1);
            channel.queueBind(QUEUE_NAME3,exchange_name,key3);
            channel.queueBind(QUEUE_NAME4,exchange_name,key4);

            String message = "key1 direct_Hello RabbitMQ!";

            // 发布消息
            /*
              1、参数是指定交换机
              2、 队列名称(采用路由名称）
              3、其他参数信息，可以为null
              4、发送消息体，需要转换成字节
             */
            channel.basicPublish(exchange_name, key1,
                    null,"key1_dmeo".getBytes());
            channel.basicPublish(exchange_name, key3,
                    null,"key3_dmeo".getBytes());
            channel.basicPublish(exchange_name, key4,
                    null,"key4_dmeo".getBytes());


            System.out.println(" [x] Sent '" + message + "'");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
